package com.atguigu.c_designed.m2stucturalModel.s5Facade;

//客户端
public class FacadeClient {

    public static void main(String[] args) {
        double paper = 0.1;
        int num = 0;
        for(;paper<=8844430;num++){
            paper = paper*2;
        }
        System.out.println(num);

//
//        SmartAppliancesFacade facade =new SmartAppliancesFacade();
//        facade.read("打开。。。");
//        facade.read("关闭。。。");
    }
    /**
     * 好处：
     *
     * - 降低了子系统与客户端之间的耦合度，使得子系统的变化不会影响调用它的客户类。
     * - 对客户屏蔽了子系统组件，减少了客户处理的对象数目，并使得子系统使用起来更加容易。
     *
     * 缺点：
     *
     * - 不符合开闭原则，修改很麻烦
     */
}

/**
 * 定义
 * 又名门面模式，是一种通过为多个复杂的子系统提供一个一致的接口，而使这些子系统更加容易被访问的模式。
 * 该模式对外有一个统一接口，外部应用程序不用关心内部子系统的具体的细节，这样会大大降低应用程序的复杂度，提高了程序的可维护性。
 * 	外观（Facade）模式是“迪米特法则”的典型应用
 */

/**
 * 结构
 *
 * 外观（Facade）模式包含以下主要角色：
 *
 * - 外观（Facade）角色：为多个子系统对外提供一个共同的接口。
 * - 子系统（Sub System）角色：实现系统的部分功能，客户可以通过外观角色访问它。
 */

// 智能音箱
class SmartAppliancesFacade{

    private TV tv;
    private Light light;

    public SmartAppliancesFacade() {
        this.tv = TV.getInstance();
        this.light = Light.getInstance();
    }

    public void read(String msg){
        if (msg.contains("打开")){
            on();
        } else if (msg.contains("关闭")) {
            off();
        }else {
            System.out.println("我没听清你说什么。。。");
        }
    }

    private void on() {
       light.on();
       tv.on();
    }

    private void off() {
       light.off();
       tv.off();
    }



}
class TV{
    private TV() {
    }

    public static TV getInstance(){
        return new TV();
    }

    public void on() {
        System.out.println("打开了电视....");
    }

    public void off() {
        System.out.println("关闭了电视....");
    }
}
class Light{

    private Light() {
    }

    public static Light getInstance(){
        return new Light();
    }



    public void on() {
        System.out.println("打开了灯....");
    }

    public void off() {
        System.out.println("关闭了电灯....");
    }
}
